Serialize me

Das Interface IF_SERIALIZABLE_OBJECT läuft einem hin und wieder in SAP-Standardklassen über den Weg.

Was ist Serialisierung?

Wikipedia sagt über Serialisierung:

Die Serialisierung ist in der Informatik eine Abbildung von strukturierten Daten auf eine sequenzielle Darstellungsform.

Eine der bekanntesten Anwendungen für die Serialisierung ist das JSON-Format, in dem komplexe Daten in einer lesbaren Form dargestellt werden können.

Eine andere Form der Serialisierung lässt sich mit XML bewerkstelligen.

Interface IF_SERIALIZABLE_OBJECT

Damit ein Objekt (Klasse) serialisierbar ist, muss es das Interface IF_SERIALIZABLE_OBJECT implementieren:

CLASS lcl_serialize_me DEFINITION.
 PUBLIC SECTION.
 INTERFACES if_serializable_object.

 DATA mt_t005  TYPE STANDARD TABLE OF t005.
 DATA mt_t005t TYPE STANDARD TABLE OF t005t.

ENDCLASS.

Zur Demonstration habe ich die zwei öffentlichen Attribute MT_T005 und MT_T005T hinzugefügt.

Um die Klasse nutzen zu können, muss sie instantiiert werden:

DATA ref TYPE REF TO lcl_serialize_me.
CREATE OBJECT ref.

In die Tabellen laden wir nun alle EG-Länder inklusive Texte:

 SELECT * FROM t005 INTO TABLE ref->mt_t005 WHERE xegld = abap_true.
 IF sy-subrc = 0.
   SELECT * FROM t005t INTO TABLE ref->mt_t005t
      FOR ALL ENTRIES IN ref->mt_t005
    WHERE land1 = ref->mt_t005-land1
      AND spras = sy-langu.
 ENDIF.

Somit haben wir eine Objektreferenz erzeugt, die ein paar Daten enthält.

Diese Daten sind auch serialisierbar. Andere Daten, wie zum Beispiel Attribute mit Referenzen zu anderen Klassen, sind nicht serialisierbar.

Deswegen darf das Interface IF_SERIALIZABLE_OBJECT nur dann implementiert werden, wenn alle Attribute der Klasse für die Serialisierung geeignet sind.

Serialisierung

Nun soll das Objekt mittels XML serialisiert werden. Das geht schnell und einfach:

DATA ser TYPE string.
CALL TRANSFORMATION id
     SOURCE model = ref
     RESULT XML ser.

Das Ergebnis ist ein lesbarer XML-String (Ausschnitt):

2015-12-02_18-20-37

Tipp: Im Debugger ist es möglich, einen XML-String komplett darstellen zu lassen:

2015-12-02_18-21-08

Speicherplatz sparen

Da die Tabellen gefüllt sind, ist das Objekt recht groß geworden. Mit GZIP schrumpfen wir es auf eine kleinere Größe:

DATA zip TYPE xstring.
cl_abap_gzip=>compress_text(
     EXPORTING text_in  = ser
     IMPORTING gzip_out = zip ).

Dies aber nur nebenbei…

Deserialisierung

Nun möchten wir das serialisierte Objekt natürlich irgendwo speichern, ablegen oder verschicken.

Das ist jedoch nur sinnvoll, wenn wir es auch wieder deserialisieren können…

Die Objektreferenz ist in dem Fall natürlich leer:

CLEAR ref.

Die Deserialisierung funktioniert ebenfalls mittel CALL TRANSFORMATION in der Standardvariante:

CALL TRANSFORMATION id
     SOURCE XML ser
     RESULT model = ref.

Im Debugger kannst du überprüfen, dass die komplette Referenz wiederhergestellt wurde. Das ist fast schon Zauberei… 🙂

Vielen Dank an Haubi für diese Idee!

Nutzen

Wozu die Serialisierung und Deserialisierung tatsächlich nützlich ist, wird man wahrscheinlich erst wissen, wenn man es braucht. Daher ist es in jedem Fall gut zu wissen, dass es funktioniert.

DEMO

Ein einfaches Demoprogramm ist DEMO_SERIALIZABLE_OBJECT. Hier wird ebenfalls die Serialisierung demonstriert.

2015-12-02_18-41-07

Wer ein komplexes Demoprogramm zur Konvertierung von (Daten-) Typen sehen möchte, sollte sich das Programm STRANSDEMO_FLIGHTS anschauen.

2015-12-02_18-37-23

Viel Spaß damit; mir ist es zu kompliziert!

Enno Wulff